/** 死亡微笑

  脚本游戏按键设定为:按键1-模拟器热键左连发,按键2-模拟器热键右连发
  把模拟器中的A,B键还有AB开快捷键同时设定为热键
  在放开A,B键时自动触发连发,按下AB快捷键则断开所有连发

  By setycyas @2024-09-25
*/

/* 全局设定
*/ {
#Warn
#MaxThreadsPerHotkey 1
SetWorkingDir(A_ScriptDir)
#Include "..\Class\FaceDetector.2.ahk"
#Include "..\Class\CommonMacro.2.ahk"
#Include "..\Class\CommonUI.2.ahk"
#Include "..\Class\MyFuns.2.ahk"
#Include "..\Class\MyEmu.2.ahk"
#Include "..\Class\OrderMap.2.ahk"
;SendMode("Event")
SendMode("Input")
}

/* 制作死亡微笑的宏类
*/ class DeathsmlMacro extends CommonMacro {

  UI := "" ;显示需要的ui
  LEFT_AUTO := False ;左连发状态
  RIGHT_AUTO := False ;右连发状态

  /* 构造函数,设定预设数据
  */
  __New(faceDetector, keys){
    super.__New(faceDetector, keys)
  }
  
  /* 不绑定按键的函数 
  */
  _开启左连发(){
    if (this.LEFT_AUTO) {
      return
    }
    this._down(1)
    this.LEFT_AUTO := True
    this.UI._statusBar.SetText("左连发开启")
  }
  _开启右连发(){
    if (this.RIGHT_AUTO) {
      return
    }
    this._down(2)
    this.RIGHT_AUTO := True
    this.UI._statusBar.SetText("右连发开启")
  }
  _中止左连发(){
    if (!this.LEFT_AUTO) {
      return
    }
    this._up(1)
    this.LEFT_AUTO := False
    this.UI._statusBar.SetText("左连发中止")
  }
  _中止右连发(){
    if (!this.RIGHT_AUTO) {
      return
    }
    this._up(2)
    this.RIGHT_AUTO := False
    this.UI._statusBar.SetText("右连发中止")
  }
  
  /* 新增的宏函数
  */
  _左射击键(key){
    local thisKey := MyFuns.getHotkey(key)
    this._中止左连发()
    this._中止右连发()
    while(MyFuns.getKeyState(thisKey)){
      sleep(30)
    }
    this._开启左连发()
  }
  _右射击键(key){
    local thisKey := MyFuns.getHotkey(key)
    this._中止左连发()
    this._中止右连发()
    while(MyFuns.getKeyState(thisKey)){
      sleep(30)
    }
    this._开启右连发()
  }
  _左右组合键(key){
    this._中止左连发()
    this._中止右连发()
  }
  
  /* 重载宏接口
  */
  _setMacro(){
    this.macroMap := OrderMap()
    this.macroMap["左射击键"] := this._左射击键.bind(this)
    this.macroMap["右射击键"] := this._右射击键.bind(this)
    this.macroMap["左右组合键"] := this._左右组合键.bind(this)
    this.macroArr := this.macroMap.getKeys()
  }
}

/* 制作死亡微笑专用UI
*/
class DeathsmlUI extends CommonUI {

  DEFAULT_HOTKEYS := "~d"
  EXE_ARRAY := ["mame.exe", "arcade64.exe", MyEmu.XZONE]

  /* 构造函数
  */
  __New(macro){
    super.__New("死亡微笑", macro)
    this._preset := OrderMap([
      "死亡微笑", ["左射击键", "右射击键", "左右组合键", "左右组合键"]
    ])
    this._macro.UI := this ;绑定UI
  }

  /* 重写接口
  */

  /* 重写setup,更改可选的exe,读入预设
  */
  setup(){
    super.setup()
    this._myGui.opt("+AlwaysOnTop")
    this._myGui.show("x1100 y330")
    this.readPresetMenu("死亡微笑")
  }

}

/* 运行当前脚本
*/ if (A_ScriptName == "死亡微笑.2.ahk") {
  iconFile := "..\Icon\死亡微笑傲娇萝莉001.png"
  TraySetIcon(iconFile, , 1)

  face := FaceDetector() ;方向检测对象
  macro := DeathsmlMacro(face, ["w","e"]) ;宏对象,有界面时第二个参数可以随便写但长度不要小于2
  ;新建界面对象并显示
  ui := DeathsmlUI(macro)
  ui.setup()
  ;更新组件内容
  ui._exeComboBox.Choose("mame.exe")
  ui._gameKeyEdit.Text := "z,x" 
  ui._hotkeyEdit.Text := "~a,~s,~d,~e"
  ui._fpsEdit.Text := "10"
  ui._testEdit.Text := "1750,2100,2100,2100"
  ui.readPresetMenu("死亡微笑")
}
